<?php
/**
【单例模式中主要角色】
Singleton 定义一个Instance操作，允许客户访问它的唯一实例。Instance是一个类方法。负责创建它的唯一的实例。

【单例模式的优点】
1、对唯一实例的受控访问
2、缩小命名空间 单例模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染命名空间
3、允许对操作和表示的精华 单例类可以有子类。而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
4、允许可变数目的实例（多例模式）
5、比类操作更灵活

【单例模式适用场景】
1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
2、当这个唯一实例应该是通过子类化可扩展的。并且用户应该无需更改代码就能使用一个扩展的实例时。
 * Created by PhpStorm.
 * User: liangtiehui
 * Date: 2016/1/5
 * Time: 18:31
 */

namespace Singleton;

/**
 * 懒汉式单例
 * Class Singleton
 * @package Singleton
 */
class Singleton {

    /**
     * 静态成员变量 保存全局实例
     */
    private static $_instance = NULL;

    /**
     *  私有化默认构造方法，保证外界无法直接实例化
     */
    private function __construct()
    {
    }

    /**
     * 静态工厂方法，返还此类的唯一实例
     * @return null|Singleton
     */
    public static function getInstance()
    {
        if (is_null(self::$_instance)) {
            self::$_instance = new Singleton();
        }
        return self::$_instance;
    }

    /**
     *  禁止克隆
     */
    public function __clone()
    {
        die('Clone is not allowed.' . E_USER_ERROR);
    }

    /**
     *  测试用方法
     */
    public function test()
    {
        echo 'Singleton Test!';
    }
}